Skip to content

结构体

前面的教程中我们讲解了数组(Array),它是一组具有相同类型的数据的集合。

但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,成绩为小数,因为数据类型不同,显然不能用一个数组来存放。

我们可以使用结构体(Struct)来存放一组不同类型的数据
结构体的定义形式为:

c
struct 结构体名
{
    成员列表
};

结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员(Member)。

c
struct STU{
    string name;  //姓名
    int num;  //学号
    int age;  //年龄
    double score;  //成绩
};

STU 为结构体名,它包含了 4 个成员,分别是 name、num、age、score。结构体成员的定义方式与变量和数组的定义方式相同,只是不能初始化。

注意

注意大括号后面的分号 ; 不能少,这是一条完整的语句。

结构体也是一种数据类型,它由我们自己定义,可以包含多个其他类型的数据。

像 int、float、char 等是由 C 语言本身提供的数据类型,不能再进行分拆,我们称之为基本数据类型;
而结构体可以包含多个基本类型的数据,也可以包含其他的结构体,我们将它称为复杂数据类型构造数据类型

结构体变量

既然结构体是一种数据类型,那么就可以用它来定义变量。例如:

c
STU stu1,stu2;

定义了两个变量 stu1 和 stu2,它们都是 STU 类型,都由 4 个成员组成。

你也可以在定义结构体的同时定义结构体变量:

c
struct STU{
    string name;  //姓名
    int num;  //学号
    int age;  //年龄
    double score;  //成绩
}stu1,stu2;

将变量放在结构体定义的最后即可。

结构体变量的引用

  • 不能将一个结构体变量作为一个整体进行输入和输出。

只能对结构体变量中的各个成员分别进行输入输出。引用结构体变量中的成员的方式为:

c
结构体变量名.成员名
结构体变量的引用 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
struct STU{
    string name;  //姓名
    int num;  //学号
    int age;  //年龄
    double score;  //成绩
};
int main()
{
    STU stu1,stu2;
	cout << "请输入stu1变量的信息:" << endl;
	cout << "请输入姓名:" ;
	cin >> stu1.name ;
	cout << "请输入学号:" ;
	cin >> stu1.num  ;
	cout << "请输入年龄:" ;
	cin >> stu1.age  ;
	cout << "请输入成绩:" ;
	cin >> stu1.score;
	cout << "stu1变量的信息如下:" << endl;
	cout << "姓名:" << stu1.name << endl;
	cout << "学号:" << stu1.num << endl;
	cout << "年龄:" << stu1.age << endl;
	cout << "成绩:" << stu1.score << endl;
    return 0;
}`'/>

运行结果:
```c
请输入stu1变量的信息:
请输入姓名:oldmoon↙(表示输入结束)
请输入学号:1↙
请输入年龄:20↙
请输入成绩:100↙
stu1变量的信息如下:
姓名:oldmoon
学号:1
年龄:20
成绩:100

注意

stu1.age 表示 stu1 变量中的 age 成员,可以对变量的成员赋值。例如: stu1.age = 18; 表示把 18 复制给 stu1 变量中的成员 age。

  • 对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。
c
    stu2.score = stu1.score;
	s = stu1.score + stu2.score;
	++ stu1.age;

分析

3 条语句分别对应的含义是:
1、将变量 stu1 的成员 score 值赋值给变量 stu2 的 score 成员;
2、s 变量的值等于变量 stu1 的 score 成员值 + stu2 的 score 成员值;
3、将变量 stu1 的成员 age 值自增 1

  • 可以引用结构体变量成员的地址。也可以引用结构体变量的地址。如:
c
scanf("%d", &stu1.age);// 输入 stu1.age 的值
printf("%p", &student1);// 输出 student1 的首地址

注意

%p 是打印地址的,是十六进制的形式。

结构体变量的初始化

  • 定义结构体变量时同时赋值,例如创建结构体变量 stu1 的同时初始化。
c
STU stu1 = {"oldmoon",1,20,100};
  • 定义后赋值
c
STU stu1;
cin >> stu1.name >> stu1.num >> stu1.age >> stu1.score;

结构体数组

  • 定义结构体数组

结构体数组格式: 声明变量类型 数组名称[数组长度]

c
STU stu[3];

以上定义了一个数组 stu,其元素为 struct STU 类型数据,数组有 3 个元素。
也可以直接定义一个结构体数组:

c
struct STU{
    string name;  //姓名
    int num;  //学号
    int age;  //年龄
    double score;  //成绩
}stu[3];
  • 结构体数组的初始化 同结构体变量一样,结构体数组也可定义时初始化,也可定义后赋值;

定义时赋值:

c
STU stu[3] = {{"oldmoon1",1,20,100},
				  {"oldmoon2",2,19,99.5},
				  {"oldmoon3",3,18,90}};

注意

每一个数组元素都用一个{}进行包括

定义后赋值:
可借助 for 循环进行输入

c
for(int i=0;i<3;i++){
		cin >> stu[i].name >> stu[i].num >> stu[i].age >> stu[i].score;
	}
  • 结构体数组的示例
结构体数组 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
struct STU{
    string name;  //姓名
    int num;  //学号
    int age;  //年龄
    double score;  //成绩
};
int main()
{
    STU stu[3];
	for(int i=0;i<3;i++){
		cout << "请输入第" << i + 1 << "个学生的名字:" ;
		cin >> stu[i].name ;
		cout << "请输入第" << i + 1 << "个学生的学号:" ;
		cin >> stu[i].num ;
		cout << "请输入第" << i + 1 << "个学生的年龄:" ;
		cin >> stu[i].age ;
		cout << "请输入第" << i + 1 << "个学生的成绩:" ;
		cin >> stu[i].score ;
	}
	cout<< endl;
	for(int i=0;i<3;i++){
		cout << "第" << i + 1 << "个学生信息如下" << endl;
		cout << "姓名:" << stu[i].name << endl;
		cout << "学号:" << stu[i].num << endl;
		cout << "年龄:" << stu[i].age << endl;
		cout << "成绩:" << stu[i].score << endl;
	}
    return 0;
}

运行结果:

c
请输入第1个学生的名字:oldmoon1↙(表示输入结束)
请输入第1个学生的学号:1
请输入第1个学生的年龄:20
请输入第1个学生的成绩:100
请输入第2个学生的名字:oldmoon2↙
请输入第2个学生的学号:2
请输入第2个学生的年龄:19
请输入第2个学生的成绩:99.5
请输入第3个学生的名字:oldmoon3↙
请输入第3个学生的学号:3
请输入第3个学生的年龄:18
请输入第3个学生的成绩:90

第1个学生信息如下
姓名:oldmoon1
学号:1
年龄:20
成绩:100
第2个学生信息如下
姓名:oldmoon2
学号:2
年龄:19
成绩:99.5
第3个学生信息如下
姓名:oldmoon3
学号:3
年龄:18
成绩:90

注意

结构体数组借助 for 循环进行输入输出